package com.jungle.admin.controller;


import cn.dev33.satoken.stp.StpUtil;
import com.jungle.common.constant.JwtClaimsConstant;
import com.jungle.common.core.domain.R;
import com.jungle.common.config.properties.JwtProperties;
import com.jungle.pojo.domain.dto.UserAccountLoginDTO;
import com.jungle.pojo.domain.dto.UserLoginDTO;
import com.jungle.system.domain.User;
import com.jungle.pojo.domain.vo.UserLoginVO;
import com.jungle.system.application.service.UserLoginService;
import com.jungle.system.utils.JwtUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 登录相关接口
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/smart/user")
@Slf4j
public class UserLoginController {

    private final UserLoginService service;
    private final JwtProperties jwtProperties;

    /**
     * 通过账号（手机号）和密码登录
     *
     * @return
     */
    @PostMapping("/login")
    public R<UserLoginVO> userLogin(@RequestBody UserAccountLoginDTO loginDTO) {
        log.info("手机号登录：{}", loginDTO);
        User user = service.login(loginDTO);
        if (user != null) StpUtil.login(user.getId());
    /*
        Cookie 可以从后端控制往浏览器中写入 token 值
        Cookie 会在前端每次发起请求时自动提交 token 值
    */
//        Map<String, Object> claims=new HashMap<>(){{
//            put(JwtClaimsConstant.USER_ID,user.getId());
//        }};
//        String token = JwtUtil.createJWT(
//                jwtProperties.getUserSecretKey(),
//                jwtProperties.getUserTtl(),
//                claims);
//        UserLoginVO vo = UserLoginVO.builder()
//                .token(token)
//                .build();
        UserLoginVO vo = UserLoginVO.builder()
                .token(StpUtil.getTokenValue()).build();
        BeanUtils.copyProperties(user, vo);
        return R.ok("登录成功", vo);
    }

    /**
     * 注册账号
     *
     * @return
     */
    @PostMapping("/register")
    public R<UserLoginVO> register(@RequestBody UserAccountLoginDTO loginDTO) {
        log.info("注册账号：{}", loginDTO);
        User user = service.register(loginDTO);
        if (user != null) {
            return R.ok("注册成功");
        }
        return R.fail("注册失败");
    }


    /**
     * 微信登录
     *
     * @return
     */
    @PostMapping("/wxLogin")
    public R<UserLoginVO> wxLogin(@RequestBody UserLoginDTO loginDTO) {
        log.info("微信登录：{}", loginDTO);
        User user = service.wxLogin(loginDTO);
        Map<String, Object> claim = new HashMap<>() {{
            put(JwtClaimsConstant.USER_ID, user.getId());
        }};
        String token = JwtUtil.createJWT(
                jwtProperties.getUserSecretKey(),
                jwtProperties.getUserTtl(), claim);
        UserLoginVO vo = UserLoginVO.builder()
//                .id(user.getId())
                .token(token)
//                .openid(user.getOpenid())
//                .avatar(user.getAvatar())
//                .nickName(user.getNickName())
//                .sex(user.getSex())
//                .phoneNumber(user.getPhoneNumber())
//                .concernNum(user.getConcernNum())
//                .fanNum(user.getFanNum())
                .build();
        BeanUtils.copyProperties(user, vo);
//        vo.setCreateTime(LocalDateTimeUtil.format(user.getCreateTime(), DatePattern.NORM_DATETIME_PATTERN));
//        log.info("创建时间-->{}",vo.getCreateTime());
        return R.ok("登录成功", vo);
    }

}
